package demo3;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 邓大帅
 * Date: 2024-01-11
 * Time: 18:10
 */
//以后可以优先使用静态内部类 非静态内部类语法比较麻烦
//    局部内部类--方法内部定义的内部类  几乎完全不用
class Out {
    public int data1 = 1;
    private int data2 = 2;
    private static int data4 = 4;
//    静态内部类
    static class In {
        public int data3 = 3;
        private int data5 = 5;
        private static int data6 = 6;
//静态内部类中不能直接访问外部类的非静态成员,可以通过外部类对象的引用来访问
        public void func() {
            Out out = new Out();
            System.out.println(out.data1);
            System.out.println(out.data2);
            System.out.println(data3);
            System.out.println(data4);
        }
    }
    public void test() {
        In in = new In();
        System.out.println(in.data5);//外部类可以访问静态内部类的所有成员，不管该成员是否是private修饰的
        System.out.println(In.data6);
    }
}
class Out1 {
    public int data1 = 1;
    private int data2 = 2;
    private static int data4 = 4;
    //    非静态内部类
    class In1 {
        public int data3 = 3;
        private int data5 = 5;
        public int data1 = 10;
//        非静态内部类中不能定义静态成员
//        private static int data6 = 6;

        public void func() {
//            当外部类和非静态内部类具有同名变量时优先访问内部类的变量
            System.out.println(data1);
//            若要访问外部类的变量语法如下：
            System.out.println(Out1.this.data1);
        }
    }
    public void test() {
        In1 in1 = new In1();
//        外部类成员方法访问实例内部类的成员变量需要利用内部类对象引用来访问
        System.out.println(in1.data3);
    }
}
interface IA {
    void func();
}
class AA implements IA {

    @Override
    public void func() {

    }
}
public class Test {
    public static void main(String[] args) {
//        匿名内部类 等价于一个类实现了IA这个接口，但没有名字
        new IA() {

            @Override
            public void func() {
                System.out.println("======");
            }
        }.func();
    }
    public static void main2(String[] args) {
//      创建一个非静态内部类的方法
        Out1 out1 = new Out1();
        Out1.In1 in1 = out1.new In1();
    }
    public static void main1(String[] args) {
        //    创建一个静态内部类的方法
        Out.In in = new Out.In();
        in.func();
    }

}
